/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufg.inf.si.poo.formula1.Race;

import br.ufg.inf.si.poo.formula1.Driver.Driver;

/**
 * GridPosition
 *
 * Versao 1.0
 *
 * Data 22/01/2013
 *
 * @author Igor
 */
public class GridPosition {
    //Atributos

    private int position;
    private int startingPosition;
    private int numberDriver;
    private Driver driver;
    private int qttLapsQualification;
    private int qttLapsRace;
    private int qttLapsCircuit;
    private long[] timeLap;
    private int points;
    private long Q1;
    private long Q2;
    private long Q3;
    private String status;

    //Construtores
    public GridPosition() {}

    public GridPosition(int numberDriver, Driver driver, int qttLapsCircuit) {
        this.position = 0;
        this.startingPosition = 0;
        this.numberDriver = numberDriver;
        this.driver = driver;
        this.qttLapsQualification = 0;
        this.qttLapsRace = 0;
        this.qttLapsCircuit = qttLapsCircuit;
        this.timeLap = new long[qttLapsCircuit];
        this.points = 0;
        this.Q1 = 0;
        this.Q2 = 0;
        this.Q3 = 0;
        this.status = "";
    }

    //Metodos Getters and Setters
    /**
     * Retorna o atributo position (posicao ao final da corrida)
     * @return o atributo position
     */
    public int getPosition() {
        return position;
    }

    /**
     * Altera o atributo position (posicao ao final da corrida)
     * @param position altera o atributo position
     */
    public void setPosition(int position) {
        this.position = position;
    }

    /**
     * Retorna o atributo startingPosition (posicao no inicio da corrida)
     * @return o atributo startingPosition
     */
    public int getStartingPosition() {
        return startingPosition;
    }

    /**
     * Altera o atributo startingPosition (posicao no inicio da corrida)
     * @param startingPosition altera o atributo startingPosition
     */
    public void setStartingPosition(int startingPosition) {
        this.startingPosition = startingPosition;
    }

    /**
     * Retorna o atributo numberDriver (numero do piloto do GridPosition, e a posicao em que foi inserido)
     * @return o atributo numberDriver
     */
    public int getNumberDriver() {
        return numberDriver;
    }

    /**
     * Altera o atributo numberDriver (numero do piloto do GridPosition, e a posicao em que foi inserido)
     * @param numberDriver altera o atributo numberDriver
     */
    public void setNumberDriver(int numberDriver) {
        this.numberDriver = numberDriver;
    }

    /**
     * Retorna o atributo driver (objeto piloto)
     * @return o atributo driver
     */
    public Driver getDriver() {
        return driver;
    }

    /**
     * Altera o atributo driver (objeto piloto)
     * @param driver altera o atributo driver
     */
    public void setDriver(Driver driver) {
        this.driver = driver;
    }

    /**
     * Retorna o atributo qttLapsQualification (quantidade de voltas do piloto na qualificacao)
     * @return o atributo qttLapsDriver
     */
    public int getQttLapsQualification() {
        return qttLapsQualification;
    }

    /**
     * Altera o atributo qttLapsQualification (quantidade de voltas do piloto na qualificacao)
     * @param qttLapsDriver altera o atributo qttLapsDriver
     */
    public void setQttLapsQualification(int qttLapsQualification) {
        this.qttLapsQualification = qttLapsQualification;
    }

    /**
     * Retorna o atributo qttLapsCircuit (quantidade de voltas do circuito)
     * @return o atributo qttLapsCircuit
     */
    public int getQttLapsCircuit() {
        return qttLapsCircuit;
    }

    /**
     * Altera o atributo qttLapsCircuit (quantidade de voltas do circuito)
     * @param qttLapsCircuit altera o atributo qttLapsCircuit
     */
    public void setQttLapsCircuit(int qttLapsCircuit) {
        this.qttLapsCircuit = qttLapsCircuit;
    }

    /**
     * Retorna o atributo qttLapsRace (quantidade de voltas do piloto na corrida)
     * @return o atributo qttLapsRace
     */
    public int getQttLapsRace() {
        return qttLapsRace;
    }

    /**
     * Altera o atributo qttLapsRace (quantidade de voltas do piloto na corrida)
     * @param qttLapsRace altera o atributo qttLapsRace
     */
    public void setQttLapsRace(int qttLapsRace) {
        this.qttLapsRace = qttLapsRace;
    }

    /**
     * Retorna o atributo timeLap (vetor de tempos, cada posicao e o tempo do piloto em uma volta)
     * @return o atributo timeLap
     */
    public long[] getTimeLap() {
        return timeLap;
    }

    /**
     * Altera o atributo timeLap (vetor de tempos, cada posicao e o tempo do piloto em uma volta)
     * @param timeLap altera o atributo timeLap
     */
    public void setTimeLap(long[] timeLap) {
        this.timeLap = timeLap;
    }

    /**
     * Retorna o atributo points (pontos do piloto, caso esteja entre os 10 primeiros)
     * @return o atributo points
     */
    public int getPoints() {
        return points;
    }

    /**
     * Altera o atributo points (pontos do piloto, caso esteja entre os 10 primeiros)
     * @param points altera o atributo points
     */
    public void setPoints(int points) {
        this.points = points;
        if(this.driver.getTeam() != null){
            this.driver.getTeam().setPoints(this.driver.getTeam().getPoints() + points);
        }
    }

    /**
     * Retorna o atributo Q1 (tempo do piloto no Q1 da qualificacao)
     * @return o atributo  Q1
     */
    public long getQ1() {
        return Q1;
    }

    /**
     * Altera o atributo Q1 (tempo do piloto no Q1 da qualificacao)
     * @param Q1 altera o atributo  Q1
     */
    public void setQ1(long Q1) {
        this.Q1 = Q1;
    }

    /**
     * Retorna o atributo Q2 (tempo do piloto no Q2 da qualificacao)
     * @return o atributo  Q2
     */
    public long getQ2() {
        return Q2;
    }

    /**
     * Altera o atributo Q2 (tempo do piloto no Q2 da qualificacao)
     * @param Q2 altera o atributo  Q2
     */
    public void setQ2(long Q2) {
        this.Q2 = Q2;
    }

    /**
     * Retorna o atributo Q3 (tempo do piloto no Q3 da qualificacao)
     * @return o atributo  Q3
     */
    public long getQ3() {
        return Q3;
    }

    /**
     * Altera o atributo Q3 (tempo do piloto no Q3 da qualificacao)
     * @param Q3 altera o atributo  Q3
     */
    public void setQ3(long Q3) {
        this.Q3 = Q3;
    }

    /**
     * Retorna o atributo status (status da corrida, se aconteceu ou nao e pq)
     * @return o atributo status
     */
    public String getStatus() {
        return status;
    }

    /**
     * Altera o atributo status (status do piloto, podendo ser vazio, RET na qualificacao ou Accident na corrida)
     * @param status altera o atributo status
     */
    public void setStatus(String status) {
        this.status = status;
    }

    //Outros Metodos
    /**
     * Retorna o somatorio do vetor timeLap
     * @return o tempo total do piloto
     */
    public long timeTotal() {
        long timeTotal = 0;
        for (int i = 0; i < this.qttLapsCircuit; i++) {
            timeTotal += timeLap[i];
        }
        return timeTotal;
    }
}
